package sma.agents;

import java.awt.Color;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JLayeredPane;
import javax.vecmath.Vector2d;

import ihm.AppliWindow;

import org.janusproject.kernel.crio.core.GroupAddress;
import org.janusproject.kernel.status.Status;
import org.janusproject.kernel.status.StatusFactory;

import sma.agents.bodies.ObstacleAgentBody;
import sma.environment.LocalEnvironment;
import sma.organizations.VirtualEnvironmentOrga;
import sma.organizations.messages.RepulsiveMessage;
import sma.organizations.roles.Decisive;
import sma.organizations.roles.Obstacle;
import sma.organizations.roles.Repulsive;
import sma.organizations.signals.SendCreateObstacleSignal;
import sma.organizations.signals.SendDeleteRepulsiveSignal;
import appli.utils.Config;



/**
 * @author Etienne Sainton
 *
 */
public class RepulsiveAgent extends StandartAgent {
	/**
	 * 
	 * Son environnement local
	 * 
	 */
	private sma.environment.LocalEnvironment environment;

	
	/**
	 * Son delta t
	 *
	 */
	private double deltaT = 0.09;
	
	
	/**
	 * Identifiant de l'agent obstacle
	 */
	private int id;
	
	
	/**
	 * Constructeur. L'agent evolue maintenant dans un environnement.
	 * 
	 * @param _environment : environnement local
	 * @param _id l'identifiant de l'agent
	 * @param _groupe le groupe de l'obstacle
	 * @see LocalEnvironment
	 */
	public RepulsiveAgent(sma.environment.LocalEnvironment _environment, int _id, int _groupe) {
		// Son environnement :
		this.environment = _environment;

		// Son id :
		this.id = _id;
		
		//Son groupe :
		this.groupe = _groupe;

		// On lui affecte un body propre à son role :
		this.body = new ObstacleAgentBody();
		
		body.setBigBodies();
		
		if (Config.DEBUG == true)
			System.out.println("Agent Repulsif " + this.getName()+ " operationnel");
		

	}
	
	/**
	 * activate, Permet d'activer l'agent avant qu'il vive. Il prend pour role
	 * ObstacleAgent dans le groupe Obstacle et NegativeAgent dans le groupe
	 * Environment. Par ailleurs des paramtres de sortie s'afficheront en cas de
	 * mode debug.
	 * 
	 * @param  parameters inutile de mettre quelque chose ici
	 */
	@Override
	public Status activate(Object... parameters) {
		super.init((JComponent) parameters[0]);
		//gui = (AppliWindow) parameters[0];
		//polaire = (Boolean) parameters[1];
		
		if (Config.DEBUG == true)
			System.out.println("Agent Repulsif " + this.getName() + " activé");
		// Recuperation de l'adresse du groupe Obstacles
		GroupAddress virtualEnvirment = getOrCreateGroup(VirtualEnvironmentOrga.class);
		
		// Affectation du role de Positive dans le groupe Voiture
		if (requestRole(Repulsive.class, virtualEnvirment, this.id, this.body, (Boolean) parameters[1], this.groupe)) {
			if (Config.DEBUG == true)
				System.out.println("RepulsiveAgent appartient au role Repulsive dans le groupe virtualEnvirment");
			return StatusFactory.ok(this);
		} else if (Config.DEBUG == true)
			System.out.println("L'agent RepulsiveAgent ne peut pas appartenir au role Repulsive dans le groupe virtualEnvirment...");
		
		return StatusFactory.cancel(this);
	}
	
	/**
	 * Vie de l'agent :
	 */
	@Override
	public Status live() {
		super.live();
	
		return StatusFactory.ok(this);
	}

	/**
	 * Mort de l'agent
	 */
	@Override
	public Status end() {
		super.end();
				
		if (Config.DEBUG == true)
			print("Je suis mort....");
		return StatusFactory.ok(this);
	}
	
}
